gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringlib/ringmsg.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK类库 ringlib.lib
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:ringmsg.cpp
//
//说明:
//    信息显示/记录类 ringMsg 实现
//
**********************************************************************/
#define MAKE_SELF_LIB
#include "ringlib.h"

RingMsg::RingMsg()
{
	m_msgMode = 0;
	m_lprf = NULL;;
	m_nMaxFileSize = -1;
	m_hWnd = NULL;
	m_msg = MYWM_ERROR;
	m_str = NULL;
	m_dwLastErrorCode = ERROR_SUCCESS;

	InitializeCriticalSection(&msg_critical);
}

RingMsg::~RingMsg()
{
	delete m_lprf;
	m_str = (LPSTR)Del(m_str);
	DeleteCriticalSection(&msg_critical);
}

void RingMsg::SetMsgMode(DWORD mode,BOOL bOverWrite/*=FALSE*/)
{
	if(bOverWrite)
		m_msgMode = mode;
	else
		m_msgMode |= mode;
}

BOOL RingMsg::SetMsgFile(LPCTSTR szfilename,int maxSize/*=-1*/)
{
	if(m_lprf == NULL)
		m_lprf = new ringFile;

	if(m_lprf)
	{
		if(szfilename != NULL)
			m_lprf->SetFile(szfilename);

		SetMsgFileSize(maxSize);
		
		m_lprf->Create(RF_APPEND);

		m_msgMode |= RINGMSG_LOGFILE;
		return TRUE;
	}
	else
		return FALSE;
}

void RingMsg::SetMsgFileSize(int maxSize/*=-1*/)
{
	if(maxSize > 0)
		m_nMaxFileSize = maxSize;
	else if(m_nMaxFileSize == -1)
		m_nMaxFileSize = 64000;
}

BOOL RingMsg::ClearMsgFile()
{
	EnterCriticalSection(&msg_critical);
	if(m_lprf)
		m_lprf->SetEndOfFile(0);
	LeaveCriticalSection(&msg_critical);
	return (BOOL)m_lprf;
}

void RingMsg::SetMsgMessage(HWND hWnd,UINT msg,BOOL bWithLine/*=TRUE*/)
{
	if(hWnd)
	{
		m_hWnd = hWnd;
		m_msg = msg;
		m_msgMode |= RINGMSG_SENDMESSAGE;
		if(!bWithLine)
			m_msgMode |= RINGMSG_NORETURN;
	}
}

BOOL RingMsg::DataOut(LPVOID lpBuf,DWORD dwSize)
{
	m_dwLastErrorCode = ERROR_SUCCESS;
	if((m_msgMode & RINGMSG_LOGFILE) && m_lprf)
	{
		EnterCriticalSection(&msg_critical);

		if((int)m_lprf->Size() > m_nMaxFileSize)
		{
			m_lprf->Seek(0);
			SetEndOfFile(m_lprf->Handle());
		}
		
		if((m_msgMode & RINGMSG_RECTIME))
		{
			char szTime[32];
			
			wsprintf(szTime,"[%d-%s-%s %s:%s:%s.%d]\0",
				m_rdt.year(),m_rdt.month2str(2),m_rdt.day2str(2),
				m_rdt.hour2str(2),m_rdt.minute2str(2),
				m_rdt.second2str(2),m_rdt.ms());
			
			m_lprf->Write(szTime,strlen(szTime));
		}
		if(m_lprf->Write(lpBuf,dwSize))
			m_lprf->Write("\r\n",2);

		LeaveCriticalSection(&msg_critical);
		return TRUE;
	}
	return FALSE;
}

void RingMsg::MsgOut(LPCTSTR format,...)
{	
	m_dwLastErrorCode = ERROR_SUCCESS;
	if(LOWORD(m_msgMode) == RINGMSG_NONE || format == NULL)
		return;

	EnterCriticalSection(&msg_critical);

	if(m_str == NULL)
		m_str = (LPSTR)New(2048);

	if(m_str)
	{
		memset(m_str,0,2048);

		va_list ap;
		
		if(format)
		{
			va_start(ap, format);
			_vsntprintf(m_str,2046,format,ap);
			//vsprintf(m_str,format,ap);
			va_end(ap);
		}

		OutFile(m_str);
		
		if((m_msgMode & RINGMSG_DEBUGOUT))
			OutputDebugString(m_str);

		SendMsgMessage(m_str,(m_msgMode & RINGMSG_NORETURN));
		
		if((m_msgMode & RINGMSG_ALERT))
			MessageBox(GetFocus(),m_str,"错误",MB_OK | MB_ICONWARNING);
	}
	LeaveCriticalSection(&msg_critical);
}

void RingMsg::MsgOutFast(LPCTSTR format)
{
	m_dwLastErrorCode = ERROR_SUCCESS;
	if(LOWORD(m_msgMode) == RINGMSG_NONE || format == NULL)
		return;
	
	EnterCriticalSection(&msg_critical);
	
	OutFile(format);
	
	if((m_msgMode & RINGMSG_DEBUGOUT))
		OutputDebugString(format);
	
	SendMsgMessage(format,(m_msgMode & RINGMSG_NORETURN));
	
	if((m_msgMode & RINGMSG_ALERT))
		MessageBox(GetFocus(),format,"错误",MB_OK | MB_ICONWARNING);
	
	LeaveCriticalSection(&msg_critical);
}

BOOL RingMsg::MsgFormatOut(DWORD dwMsgId)
{
	m_dwLastErrorCode = dwMsgId;
	if(m_str == NULL)
		m_str = (LPSTR)New(2048);
	else
		memset(m_str,0,2048);

	if(GetErrMessage(dwMsgId,m_str,2048))
	{
		m_dwLastErrorCode = dwMsgId;
		MsgOutFast(m_str);
		return TRUE;
	}
	else
		return FALSE;
}

void RingMsg::SendMsgMessage(LPCTSTR lpMsg,int nErr,BOOL bError)
{
	if((m_msgMode & RINGMSG_SENDMESSAGE) && lpMsg)		
	{
		if(m_msg == EM_REPLACESEL)
		{
			int Pos = SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0);
			
			if(Pos + strlen(lpMsg) >= 16384)
			{
				Pos = SendMessage(m_hWnd, EM_LINEFROMCHAR, 1638, 0) + 1;
				Pos = SendMessage(m_hWnd, EM_LINEINDEX, Pos, 0);
				SendMessage(m_hWnd, EM_SETSEL, 0, Pos);
				SendMessage(m_hWnd, EM_REPLACESEL, FALSE, (LPARAM)"");
				
				Pos = SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0);				
			}
			SendMessage(m_hWnd, EM_SETSEL, Pos, Pos);

			if(bError)
			{
				char szMsg[32];
				sprintf(szMsg,"错误,代码%d:",nErr);
				m_dwLastErrorCode = (DWORD)nErr;
				SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)szMsg);
			}			
			SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)lpMsg);
			if(nErr != RINGMSG_NORETURN)
				SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)"\r\n");			
		}
		else
			SendMessage(m_hWnd,m_msg,nErr,(LPARAM)lpMsg);
	}
}

void RingMsg::PostMsgMessage(LPCTSTR lpMsg,int nErr,BOOL bError)
{
	if((m_msgMode & RINGMSG_SENDMESSAGE) && lpMsg)		
	{
		if(m_msg == EM_REPLACESEL)
		{
			static int btCnt = 0;
			btCnt += strlen(lpMsg);
			if(btCnt > 3800)
			{
				char tmp[4];
				int cnt = SendMessage(m_hWnd,EM_GETLINE,0,(LPARAM)tmp);
				SendMessage(m_hWnd,EM_SETSEL,0,cnt);
				SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)"");
				SendMessage(m_hWnd,EM_SETSEL,btCnt,btCnt);
			}
			if(bError)
			{
				char szMsg[32];
				sprintf(szMsg,"错误,代码%d:",nErr);
				m_dwLastErrorCode = (DWORD)nErr;
				SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)szMsg);
			}
			SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)lpMsg);
			if(nErr != RINGMSG_NORETURN)
				SendMessage(m_hWnd,EM_REPLACESEL,0,(LPARAM)"\r\n");			
		}
		else
			PostMessage(m_hWnd,m_msg,nErr,(LPARAM)lpMsg);
	}
}

void RingMsg::OutFile(LPCTSTR lpMsg)
{
	if((m_msgMode & RINGMSG_LOGFILE) && m_lprf && lpMsg)
	{
		if((int)m_lprf->Size() > m_nMaxFileSize)
		{
			m_lprf->SeekToBegin();
			m_lprf->SetEndOfFile();
		}
			
		if((m_msgMode & RINGMSG_RECTIME))
		{
			char szTime[32];
		
			wsprintf(szTime,"[%d-%s-%s %s:%s:%s.%d]\0",
				m_rdt.year(),m_rdt.month2str(2),m_rdt.day2str(2),
				m_rdt.hour2str(2),m_rdt.minute2str(2),
				m_rdt.second2str(2),m_rdt.ms());
		
			m_lprf->Write(szTime,strlen(szTime));
		}
		
		m_lprf->Write((LPSTR)lpMsg,strlen(lpMsg));
		m_lprf->Write("\r\n",2);
	}
}

BOOL RingMsg::DeleteMsgFile()
{
	EnterCriticalSection(&msg_critical);
	BOOL bOK = FALSE;

	if(m_lprf)
		if(m_lprf->delIt())
		{
			delete m_lprf;
			m_lprf = NULL;
			bOK = TRUE;
		}
	LeaveCriticalSection(&msg_critical);
	return bOK;
}

int RingMsg::GetMsgFileSize()
{
	EnterCriticalSection(&msg_critical);
	
	int nSize = 0;

	if(m_lprf)
		nSize	= m_lprf->Size();

	LeaveCriticalSection(&msg_critical);
	return nSize;
}

void RingMsg::ErrOut(int errCode,LPCTSTR szErr)
{
	m_dwLastErrorCode = (DWORD)errCode;
	if(LOWORD(m_msgMode) == RINGMSG_NONE || szErr == NULL)
		return;
	
	EnterCriticalSection(&msg_critical);
	
	SendMsgMessage(szErr,errCode,TRUE);

	if(m_str == NULL)
		m_str = (LPSTR)New(1024);
	
	sprintf(m_str,"错误,代码%d:%s",errCode,szErr);
	OutFile(m_str);
		
	if((m_msgMode & RINGMSG_DEBUGOUT))
		OutputDebugString(m_str);
		
	if((m_msgMode & RINGMSG_ALERT))
		MessageBox(GetFocus(),m_str,"错误",MB_OK | MB_ICONWARNING);
	
	LeaveCriticalSection(&msg_critical);
}
/*
void RingMsgClass::MsgOut(LPCTSTR format,...)
{
	if(m_msg == NULL)
		return;
	
	if(m_msg->m_msgMode == RINGMSG_NONE || format == NULL)
		return;
	
	EnterCriticalSection(&m_msg->msg_critical);
	
	if(m_msg->m_str == NULL)
		m_msg->m_str = (LPSTR)New(1024);
	
	if(m_msg->m_str)
	{
		memset(m_msg->m_str,0,1024);
		
		va_list ap;
		
		va_start(ap, format);
		vsprintf(m_msg->m_str,format,ap);
		va_end(ap);
		
		m_msg->OutFile(m_msg->m_str);
		
		if((m_msg->m_msgMode & RINGMSG_DEBUGOUT))
			OutputDebugString(m_msg->m_str);
		
		m_msg->SendMsgMessage(m_msg->m_str,0);
		
		if((m_msg->m_msgMode & RINGMSG_ALERT))
			MessageBox(GetFocus(),m_msg->m_str,"错误",MB_OK | MB_ICONWARNING);
	}
	LeaveCriticalSection(&m_msg->msg_critical);
}
*/